import { createApp } from 'vue'
import App from './App.vue'
import router from './router'
import { asyncRoutes, filterAsyncRoutes } from './router'
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'
import './assets/common.css'
import axios from 'axios'
import { isAuthenticated, getAdminInfo, getAdminId, getAdminLevel } from './utils/auth'

const app = createApp(App)
app.use(ElementPlus)
app.use(router)

// 处理页面刷新后路由丢失的问题
async function initDynamicRoutes() {
  // 检查管理员是否已认证
  if (isAuthenticated()) {
    // 获取管理员信息
    const adminInfo = getAdminInfo();
    console.log('[main.js] 管理员信息:', adminInfo);
    
    // 获取管理员等级
    const adminLevel = getAdminLevel();
    console.log('[main.js] 管理员级别:', adminLevel);
    
    if (adminLevel) {
      // 根据权限过滤可访问路由
      const accessibleRoutes = filterAsyncRoutes(asyncRoutes, adminLevel);
      console.log('[main.js] 过滤后的可访问路由:', accessibleRoutes);
      
      // 将过滤后的路由添加到路由器
      accessibleRoutes.forEach(route => {
        router.addRoute(route);
      });
      
      console.log('[main.js] 已恢复动态路由:', accessibleRoutes);
      
      // 获取当前路径
      const currentPath = window.location.pathname;
      
      // 处理刷新页面的情况
      if (currentPath !== '/login' && currentPath !== '/403') {
        // 等待路由准备就绪
        await router.isReady();
        
        // 检查当前路径是否匹配有效路由
        const hasMatchedRoute = router.resolve(currentPath).matched.length > 0;
        
        if (!hasMatchedRoute) {
          console.log(`[main.js] 当前路径 ${currentPath} 未匹配到有效路由，重新导航`);
          
          // 对于低级管理员，默认导向个人信息页
          if (adminLevel === 2) {
            router.replace('/profile');
          } else {
            // 对于超级管理员，默认导向首页
            router.replace('/');
          }
        } else {
          // 当前路径有效，刷新当前路由以确保组件正确加载
          console.log(`[main.js] 刷新当前路径: ${currentPath}`);
          router.replace(currentPath);
        }
      }
    } else {
      console.warn('[main.js] 管理员信息缺少级别字段');
      router.push('/login');
    }
  } else {
    console.warn('[main.js] 管理员未认证或认证已过期');
    
    // 如果用户未认证且当前不在登录页，重定向到登录页
    const currentPath = window.location.pathname;
    if (currentPath !== '/login' && currentPath !== '/403') {
      console.log('[main.js] 用户未登录，重定向到登录页面');
      router.push('/login');
    }
  }
}

// 初始化动态路由，处理页面刷新问题
initDynamicRoutes();

// 配置axios
app.config.globalProperties.$axios = axios
// 设置基础URL - 如果有需要的话
// axios.defaults.baseURL = 'https://smartsound.top/api/v1/'
// 设置默认请求头
axios.defaults.headers.post['Content-Type'] = 'application/json'
axios.defaults.withCredentials = false // 设置不发送凭证
axios.defaults.headers.common['Access-Control-Allow-Origin'] = '*' // 尝试设置CORS头

// 需要添加adminID请求头的API路径列表
const adminApiEndpoints = [
  '/api/v1/admin/devices',
  '/api/v1/admin/devices/status',
  '/api/v1/admin/userdata',
  '/api/v1/admin/list',
  '/api/v1/admin/userdetail',
  '/api/v1/admin/adddevices',
  '/api/v1/admin/listening_time_distribution',
  '/api/v1/admin/user_activity',
  '/api/v1/admin/device_activity',
  '/api/v1/admin/music_overview',
  '/api/v1/admin/get_my_logs',
  '/api/v1/admin/get_admin_logs',
  '/api/v1/admin/changepassword',
  '/api/v1/admin/change_name',
  '/api/v1/admin/update_info',
  '/api/v1/admin/register',
  '/api/v1/admin/log_activity',
  '/api/admin/feedback/v1/reply',
  '/api/admin/feedback/v1/list',
  '/api/admin/feedback/v1/get_replies',
  '/api/admin/feedback/v1/update_status',
  '/api/admin/v1/announcements',
  '/api/v1/admin/delete',
  '/api/v1/admin/changeauthority',
  '/api/v1/admin/toggle_active'
];

// 添加请求拦截器，为特定管理员API添加adminID请求头
axios.interceptors.request.use(config => {
  // 检查URL是否匹配需要添加adminID的API路径
  const isAdminApi = adminApiEndpoints.some(endpoint => config.url.includes(endpoint));
  
  if (isAdminApi) {
    // 从认证工具获取管理员ID
    const adminId = getAdminId();
    
    if (adminId) {
      // 将adminID添加到请求头
      config.headers['adminID'] = adminId;
      console.log(`[Axios] 已为请求 ${config.url} 添加adminID:`, adminId);
    } else {
      console.warn(`[Axios] 无法为请求 ${config.url} 添加adminID: 未找到管理员ID`);
    }
  }
  
  return config;
}, error => {
  return Promise.reject(error);
});

// 添加响应拦截器，统一处理错误，但不再进行token相关处理
axios.interceptors.response.use(
  response => {
    // 对响应数据做些什么
    return response;
  },
  error => {
    // 对响应错误做些什么
    console.error('API错误:', error);
    
    if (error.response) {
      // 请求已发出，服务器用状态码响应
      if (error.response.status === 403) {
        // 无权限访问
        console.error('无权限访问');
      }
    } else if (error.request) {
      // 请求已发出但没有收到响应
      console.error('未收到服务器响应');
    } else {
      // 设置请求时出了点问题
      console.error('请求配置出错:', error.message);
    }
    
    return Promise.reject(error);
  }
);

// 添加全局方法，检查管理员等级
app.config.globalProperties.$checkAdminLevel = function(level) {
  return getAdminLevel() === level;
};

app.mount('#app')

// app.vue写在script里面  main.js写在app挂载完之后
const debounce = (fn, delay) => {
    let timer
     return (...args) => {
       if (timer) {
         clearTimeout(timer)
       }
       timer = setTimeout(() => {
         fn(...args)
       }, delay)
     }
  }
const _ResizeObserver = window.ResizeObserver;
window.ResizeObserver = class ResizeObserver extends _ResizeObserver{
    constructor(callback) {
        callback = debounce(callback, 200);
        super(callback);
    }
}